/* 
 * @(#)MathUtils.java    Created on 2006-1-17
 * Copyright (c) 2006 ZDSoft Networks, Inc. All rights reserved.
 * $Header: /project/keel/src/net/zdsoft/keel/util/MathUtils.java,v 1.1 2006/03/28 06:07:54 huangwj Exp $
 */
package cn.collin.commons.utils;

import java.math.BigDecimal;

/**
 * ����Java�ļ����Ͳ��ܹ���ȷ�ĶԸ������������, <br>
 * �˹������ṩ��ȷ�ĸ���������, ��(�Ӽ�˳����������.
 * 
 * @author songzc
 * @version $Revision: 1.1 $, $Date: 2006/03/28 06:07:54 $
 */
public class MathUtils {

	// Ĭ�ϳ����㾫��
	private static final int DEFAULT_DIV_SCALE = 10;

	/**
	 * �ṩ��ȷ�ļӷ�����.
	 * 
	 * @param v1
	 *            ������
	 * @param v2
	 *            ����
	 * @return }�����ĺ�
	 */
	public static double add(double v1, double v2) {
		BigDecimal b1 = new BigDecimal(v1);
		BigDecimal b2 = new BigDecimal(v2);

		return b1.add(b2).doubleValue();
	}

	/**
	 * �ṩ(���)��ȷ�ĳ�����, �����������ʱ, ��ȷ��С����Ժ�10λ, �Ժ��������������.
	 * 
	 * @param v1
	 *            ������
	 * @param v2
	 *            ����
	 * @return }��������
	 */
	public static double div(double v1, double v2) {
		return div(v1, v2, DEFAULT_DIV_SCALE);
	}

	/**
	 * �ṩ(���)��ȷ�ĳ�����. �����������ʱ, ��scale����ָ������, �Ժ��������������.
	 * 
	 * @param v1
	 *            ������
	 * @param v2
	 *            ����
	 * @param scale
	 *            ��ʾ��ʾ��Ҫ��ȷ��С����Ժ�λ��
	 * @return }��������
	 */
	public static double div(double v1, double v2, int scale) {
		if (scale < 0) {
			throw new IllegalArgumentException(
					"The scale must be a positive integer or zero");
		}

		BigDecimal b1 = new BigDecimal(v1);
		BigDecimal b2 = new BigDecimal(v2);

		return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
	}

	/**
	 * �ṩ��ȷ�ĳ˷����㡣
	 * 
	 * @param v1
	 *            ������
	 * @param v2
	 *            ����
	 * @return }�����Ļ�
	 */
	public static double mul(double v1, double v2) {
		BigDecimal b1 = new BigDecimal(v1);
		BigDecimal b2 = new BigDecimal(v2);

		return b1.multiply(b2).doubleValue();
	}

	/**
	 * �ṩ��ȷ��С��λ�������봦��.
	 * 
	 * @param v
	 *            ��Ҫ�������������
	 * @param scale
	 *            С������λ
	 * @return ���������Ľ��
	 */
	public static double round(double v, int scale) {
		if (scale < 0) {
			throw new IllegalArgumentException(
					"The scale must be a positive integer or zero");
		}

		BigDecimal b = new BigDecimal(v);
		BigDecimal one = new BigDecimal(1);

		return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
	}

	/**
	 * �ṩ��ȷ�ļ�����.
	 * 
	 * @param v1
	 *            ������
	 * @param v2
	 *            ����
	 * @return }�����Ĳ�
	 */
	public static double sub(double v1, double v2) {
		BigDecimal b1 = new BigDecimal(v1);
		BigDecimal b2 = new BigDecimal(v2);

		return b1.subtract(b2).doubleValue();
	}

	private MathUtils() {
	}

}
